package jiangjie1;
/*
static关键字的使用
1.static:静态的。
2.static可以用来修饰:属性，方法，代码块，内部类。
3.使用static修饰属性:静态变量(或类变量）
  3.1:按是否使用static修饰，又分为:静态变量 vs 非静态变量（实例变量）。
      实例变量:我们创建了类的对象，每个对象都独立的拥有一套类中的非静态属性，当修改其中一个对象的非静态属性时，
             不会导致其他对象中同样的属性值的修改。
      静态变量:我们创建了类的对象，每个对象都共享同一个静态变量，当通过某一个对象修改静态变量时，
             会导致其他对象调用此静态变量时，是修改过了的。
  3.2:static修饰属性的其他说明:
      3.2.1静态变量随着类的加载而加载，可以通过“类.静态变量”的方式进行调用
      3.2.2静态变量的加载要早于对象的创建，
      3.2.3由于类只会加载一次，则静态变量在内存中也只会存在一一份，存在方法区的静态域中，
      3.2.4           类变量        实例变量
             类        yes          no
             对象      yes          yes
  3.3静态属性的举例:System.out,Math.PI。
4.使用static修饰方法:静态方法
  4.1随着类的加载而加载，可以通过“类.静态方法”的方式进行调用。
  4.2              静态方法     非静态方法
       类           yes          no
       对象         yes          yes
  4.3静态方法中，只能调用静态的方法或属性。
     非静态方法中，既可以调用非静态的方法或属性，也能调用静态的方法或属性。
5.static注意点:
  5.1在静态的方法中，不能使用this关键字和super关键字。
  5.2关于静态属性和静态方法的使用，要从生命周期的角度去理解。
6.面试题
  6.1开发中，如何确定一个属性是否要声明为static？
     属性是可以被多个对象所共享的，不会随着对象的不同而不同的。
     类中的常量往往也声明为static，比如Math.PI。
  6.2开发中，如何确定一个方法是否要声明为static？
     操作静态属性的方法，通常设置为static。
     工具类中的方法，习惯上声明为static的，比如，Math,Arrays,Collections。
7.关于静态方法的重写和多态的说明
   静态方法可以被继承，但是，不能被覆盖，即重写。如果父类中定义的静态方法在子类中被重新定义，
   那么在父类中定义的静态方法将被隐藏。可以使用语法：父类名.静态方法调用隐藏的静态方法。如果
   父类中含有一个静态方法，且在子类中也含有一个返回类型、方法名、参数列表均与之相同的静态方
   法，那么该子类实际上只是将父类中的该同名方法进行了隐藏，而非重写。换句话说，父类和子类中
   含有的其实是两个没有关系的方法，它们的行为也并不具有多态性 。因此，通过一个指向子类对象的
   父类引用变量来调用父子同名的静态方法时，只会调用父类的静态方法。
 */
public class StaticTest {
    public static void main(String[] args) {
        Chinese c1=new Chinese();
        c1.name="姚明";
        c1.age=40;
        Chinese c2=new Chinese();
        c2.name="马龙";
        c2.age=30;
        c1.nation="china";
        System.out.println("c1 name is "+c1.name+" age is "+c1.age+" nation is "+c1.nation);
        System.out.println("c2 name is "+c2.name+" age is "+c2.age+" nation is "+c2.nation);
        //Chinese.name="张继科";编译不通过

    }
}
